import { DataType } from "./type";
import type { VarDeclare } from "../data/var_declare";
import type { IDeserializable } from "~/models/serialize/IDeserializable";
import { Deserializer } from "~/models/serialize/Deserializer";
import { tNull } from ".";
import { Dzer } from "~/models/serialize";

// 定义: 接口类型 (和类型)：
// 不是一种具体的类型，而是类型的类型。在这里定义结构和生成器

export class ListType extends DataType implements IDeserializable {

  className: string = 'ListType'
  static {
  }

  name: string 

  constructor(
    public itemType: DataType = tNull
  ) {
    super()
    this.name = `${itemType.name}[]`
  }

  get default(): any {
    return []
  }

  // 和类型能接受成员类型列表相同的
  // 注意！：为防止类型意义的错误解释。成员类型需要相同，而不是兼容
  // 否则 rect(x, y, w, h)和rect(l, r, b, t)将会混淆！
  receiveType(t: DataType): boolean {
    // 同一类型则跳过后续判断
    if (t.name === this.name) {
      return true;
    }

    const _t = t as ListType
    // 只能够接受其他列表类型
    if (_t.itemType === undefined) {
      return false;
    }

    return this.itemType.receiveType(_t.itemType)
  }

  override receiveValue(v: any): boolean {
    if (Object.prototype.toString.call(v) !== '[object Array]') {
        return false
    }
    const _v = v as any[]
    return v.every((sub: any) => {
      return this.itemType.receiveValue(sub)
    })
  }
}

